package br.com.cnpv.modelo.bo;

import java.util.Date;
import java.util.List;

import org.hibernate.Session;

import br.com.cnpv.modelo.acesso.idao.IUsuarioDAO;
import br.com.cnpv.modelo.dao.UsuarioDAO;
import br.com.cnpv.modelo.entity.Usuario;
import br.com.cnpv.util.EncriptaSenha;
import br.com.cnpv.util.HibernateUtil;

/**
 * 
 * @author rmsilva
 *
 */
public class UsuarioBO extends HibernateUtil{

	public static UsuarioBO INSTANCE;
	
	/**
	 * 
	 * @return
	 */
	public static UsuarioBO getInstance()
	{
		if(INSTANCE == null)
		{
			synchronized (UsuarioBO.class) {
				INSTANCE = new UsuarioBO();
			}
		}
		return INSTANCE;
	}

	/**
	 * 
	 * @param usuario
	 * @return
	 * @throws Exception
	 */
	public Usuario login(Usuario usuario) throws Exception{
		Session session = null;
		
		try
		{
			session = currentSession();
			IUsuarioDAO dao = new UsuarioDAO();
			
			// senha
			usuario.setSenha(EncriptaSenha.encripta(usuario.getSenha()));
			
			usuario = dao.login(usuario, session);
		}catch(Exception e)
		{
			e.printStackTrace();
		}finally
		{
			if(session != null)
			{
				session.flush();
				session.clear();
			}
			closeSession();
		}
		return usuario;
	}

	/**
	 * 
	 * @param usuario
	 * @return
	 * @throws Exception
	 */
	public List<Usuario> buscar(Usuario usuario) throws Exception
	{
		Session session = null;
		List<Usuario> list = null;
		try
		{
			session = currentSession();
			IUsuarioDAO dao = new UsuarioDAO();
			list = dao.buscar(usuario, session);
		}catch(Exception e)
		{
			throw new Exception(e);
		}finally
		{
			if(session != null)
			{
				session.flush();
				session.clear();
			}
			closeSession();
		}
		return list;
	}
	
	/**
	 * 
	 * @return
	 * @throws Exception
	 */
	public List<Usuario> listar() throws Exception
	{
		Session session = null;
		List<Usuario> list = null;
		try
		{
			session = currentSession();
			IUsuarioDAO dao = new UsuarioDAO();
			list = dao.listar(session);
			
		}catch(Exception e)
		{
			throw new Exception(e);
		}finally
		{
			if(session != null)
			{
				session.flush();
				session.clear();
				closeSession();
			}
		}
		return list;
	}
	
	/**
	 * 
	 * @param usuario
	 * @throws Exception
	 */
	public void saveOrUpdate(Usuario usuario) throws Exception{
		Session session = null;
		try
		{
			session = currentSession();
			IUsuarioDAO dao = new UsuarioDAO();
			usuario.setDtIncl(new Date());
			usuario.setSenha(EncriptaSenha.encripta(usuario.getSenha()));
			dao.saveOrUpdate(usuario, session);
			
		}catch(Exception e)
		{
			throw new Exception(e);
		}finally
		{
			if(session != null)
			{
				session.flush();
				session.clear();
				closeSession();
			}
		}
	}
}